package com.minio.util;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;

/**
 * JSON 模板读取工具类
 * 支持从外部文件目录读取 JSON 模板并进行变量替换
 */
@Slf4j
public class JsonTemplateReader {
    
    /**
     * 从外部文件目录读取 JSON 模板文件
     * @param filePath 文件绝对路径
     * @return JSON 字符串
     */
    public static String readTemplate(String filePath) {
        try {
            Path path = Paths.get(filePath);
            if (!Files.exists(path)) {
                log.error("模板文件不存在: {}", filePath);
                return null;
            }
            
            // 使用兼容的方式读取文件内容
            StringBuilder content = new StringBuilder();
            try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
                String line;
                while ((line = reader.readLine()) != null) {
                    content.append(line).append("\n");
                }
            }
            return content.toString();
        } catch (IOException e) {
            log.error("读取模板文件失败: {}", filePath, e);
            return null;
        }
    }
    
    /**
     * 从外部文件目录读取 JSON 模板并进行变量替换
     * @param filePath 文件绝对路径
     * @param variables 变量映射
     * @return 替换后的 JSON 字符串
     */
    public static String readTemplateWithVariables(String filePath, Map<String, String> variables) {
        String template = readTemplate(filePath);
        if (template == null) {
            return null;
        }
        
        return replaceVariables(template, variables);
    }
    
    /**
     * 替换模板中的变量
     * @param template 模板字符串
     * @param variables 变量映射
     * @return 替换后的字符串
     */
    public static String replaceVariables(String template, Map<String, String> variables) {
        if (template == null || variables == null || variables.isEmpty()) {
            return template;
        }
        
        String result = template;
        for (Map.Entry<String, String> entry : variables.entrySet()) {
            String placeholder = "${" + entry.getKey() + "}";
            String value = entry.getValue() != null ? entry.getValue() : "";
            result = result.replace(placeholder, value);
        }
        
        return result;
    }
    
    /**
     * 验证 JSON 格式是否正确
     * @param jsonString JSON 字符串
     * @return 是否为有效的 JSON
     */
    public static boolean isValidJson(String jsonString) {
        if (!StringUtils.hasText(jsonString)) {
            return false;
        }
        
        try {
            JsonParser.parseString(jsonString);
            return true;
        } catch (Exception e) {
            log.warn("JSON 格式验证失败", e);
            return false;
        }
    }
    
    /**
     * 解析 JSON 字符串为 JsonObject
     * @param jsonString JSON 字符串
     * @return JsonObject 对象
     */
    public static JsonObject parseJson(String jsonString) {
        if (!isValidJson(jsonString)) {
            return null;
        }
        
        try {
            return JsonParser.parseString(jsonString).getAsJsonObject();
        } catch (Exception e) {
            log.error("解析 JSON 失败", e);
            return null;
        }
    }
}
